home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_300 / 310_02 / phil.st < prev    next >
Text File  |  1990-04-18  |  2KB  |  75 lines

  1. Class  Main
  2. [
  3.     main
  4.         ( DiningPhilosophers new: 5 ) dine: 4
  5. ]
  6.  
  7. Class  DiningPhilosophers
  8. | diners  forks  philosophers |
  9. [
  10.     new: aNumber
  11.         diners <- aNumber.
  12.         forks <- Array new: aNumber.
  13.         philosophers <- Array new: aNumber.
  14.         (1 to: diners) do:
  15.         [ :p | forks at: p put: (Semaphore new: 1).
  16.                philosophers at: p put: (Philosopher new: p)]
  17.  
  18. |
  19.     dine: time
  20.         (1 to: diners) do:
  21.         [ :p | (philosophers at: p)
  22.                 leftFork: (forks at: p)
  23.                 rightFork: (forks at: ((p \\ diners) + 1))].
  24.         time timesRepeat:
  25.         [(1 to: diners) do: [ :p | (philosophers at: p) philosophize]].
  26.         (1 to: diners) do:
  27.         [ :p | (philosophers at: p) sleep]
  28. ]
  29.  
  30. Class  Philosopher
  31. | leftFork  rightFork  myName  myPhilosophy |
  32. [
  33.     new:  name
  34.         myName <- name.
  35.         myPhilosophy <- [[true] whileTrue:
  36.                 [self think.
  37.                  self getForks.
  38.                  self eat.
  39.                  self releaseForks.
  40.                  selfProcess suspend]
  41.                 ] newProcess
  42.  
  43. |
  44.     leftFork: lfork  rightFork: rfork
  45.         leftFork <- lfork.
  46.         rightFork <- rfork
  47. |
  48.     getForks
  49.         ((myName \\ 2) == 0)
  50.         ifTrue: [leftFork wait.  rightFork wait]
  51.         ifFalse: [rightFork wait.  leftFork wait]
  52. |
  53.     releaseForks
  54.         leftFork signal.
  55.         rightFork signal
  56.  
  57. |
  58.     think
  59.         ('Philosopher ',(myName asString),' is thinking.') print.
  60.         10 timesRepeat: [selfProcess yield]
  61. |
  62.     eat
  63.         ('Philosopher ',(myName asString),' is eating.') print.
  64.         10 timesRepeat: [selfProcess yield]
  65.  
  66. |
  67.     philosophize
  68.         myPhilosophy resume
  69. |
  70.     sleep
  71.         myPhilosophy terminate.
  72.         ('Philosopher ',(myName asString),' is sleeping.') print.
  73.         myPhilosophy <- nil
  74. ]
  75.